package leetcode12;

import java.util.LinkedList;

public class test67 {
    /**
     *394. 字符串解码
     * @param s
     * @return
     */
    public String decodeString(String s) {
        StringBuilder res = new StringBuilder(); // 用于存储当前构建的字符串结果
        int multi = 0; // 当前倍数（数字）
        LinkedList<Integer> stack_multi = new LinkedList<>(); // 用于存储倍数的栈
        LinkedList<String> stack_res = new LinkedList<>(); // 用于存储中间字符串的栈

        // 遍历字符串中的每一个字符
        for (Character c : s.toCharArray()) {
            // 遇到 '['，表示接下来会有一个重复的字符串
            if (c == '[') {
                // 把当前的倍数和已构建的字符串结果推入栈中
                stack_multi.addLast(multi);
                stack_res.addLast(res.toString());

                // 复位 `multi` 和 `res`，以便处理新的内容
                multi = 0;
                res = new StringBuilder();
            }
            // 遇到 ']'，表示一个重复序列的结束，需要解码这个部分
            else if (c == ']') {
                StringBuilder tmp = new StringBuilder();
                int cur_multi = stack_multi.removeLast(); // 从栈中取出倍数

                // 将当前构建的字符串（res）重复 `cur_multi` 次
                for (int i = 0; i < cur_multi; i++) {
                    tmp.append(res);
                }

                // 将栈中的前一个结果与新构建的 `tmp` 相连接，形成新的 `res`
                res = new StringBuilder(stack_res.removeLast() + tmp);
            }
            // 如果遇到数字字符，就把它转换成整数，更新 `multi`，以处理多位数字的情况
            else if (c >= '0' && c <= '9') {
                multi = multi * 10 + Integer.parseInt(c + "");
            }
            // 如果是字母字符，直接追加到 `res` 中
            else {
                res.append(c);
            }
        }

        // 返回最终构建的字符串
        return res.toString();
    }
}
